package modelos;

import java.awt.Point;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;

public class Liga {
	
	private Vector<Arbitro> arbitros;
	private Vector<Equipo> equipos;
	private Vector<Partido> partidos;
		
	public Liga() {
		this.arbitros = new Vector<Arbitro>();
		this.equipos = new Vector<Equipo>();
		this.partidos = new Vector<Partido>();
	}

	public Vector<Arbitro> getArbitros() {
		return arbitros;
	}

	public void setArbitros(Vector<Arbitro> arbitros) {
		this.arbitros = arbitros;
	}

	public Vector<Equipo> getEquipos() {
		return equipos;
	}

	public void setEquipos(Vector<Equipo> equipos) {
		this.equipos = equipos;
	}

	public Vector<Partido> getPartidos() {
		return partidos;
	}

	public void setPartidos(Vector<Partido> partidos) {
		this.partidos = partidos;
	}
	
	public void agregarArbitro(Arbitro arbitro) {
		arbitros.addElement(arbitro);
	}
	
	public void agregarEquipo(Equipo equipo) {
		equipos.addElement(equipo);
	}

	public void agregarPartido(Partido partido) {
		partidos.addElement(partido);
	}

	public int cantidadArbitros() {
		return arbitros.size();
	}
	
	public int cantidadEquipos() {
		return equipos.size();
	}	

	public int cantidadPartidos() {
		return partidos.size();
	}
	
	public int numeroAleatorio (int inferior, int superior) {
		return (int) Math.round(inferior + (Math.random() * (superior - inferior)));
	}
	
	public Arbitro arbitroAleatorio() {
		return arbitros.elementAt(numeroAleatorio (0, arbitros.size()-1));
	}
	
	public Vector<Point> vectorCruces(){
		Vector<Point> cruces = new Vector<Point>();
		Vector<Integer> listado = new Vector<Integer>();
		
		Point partido;
		int a;
		int b;
		for (int i=0;i<cantidadEquipos();i++)
            listado.add(i);
	    for (int j=0;j<cantidadEquipos()-1;j++){
            for (int k=0;k<cantidadEquipos()/2;k++){
                partido = new Point(listado.elementAt(k), listado.elementAt(cantidadEquipos()-1-k));
                cruces.add(cruces.size()/2, partido);
                partido = new Point(listado.elementAt(cantidadEquipos()-1-k), listado.elementAt(k));
                cruces.add(partido);
            }
            a = new Integer(listado.elementAt(1));
            for (int n=1;n<cantidadEquipos()-1;n++)
            {
                b = new Integer(listado.elementAt(n+1));
                listado.set(n+1,a);
                a = new Integer(b);
            }
            listado.set(1,a);
        }
		return cruces;
	}
	
	public void equiposPartidos(){
		Vector<Point> cruces = vectorCruces();
		Partido mPartido;
		for (int i=0;i<cruces.size();i++){
			mPartido = new Partido(i + 1);
			mPartido.setEquipoCasa(this.getEquipos().elementAt((int) cruces.elementAt(i).getX()));
			mPartido.setEquipoVisitante(this.getEquipos().elementAt((int) cruces.elementAt(i).getY()));
			agregarPartido(mPartido);
		}
	}
	
	public void fechasPartidos(){
		Calendar fecha = Calendar.getInstance();
		long dia = 1 * 24 * 60 * 60 * 1000;
		while(fecha.get(Calendar.DAY_OF_WEEK) != 5){
			fecha.setTimeInMillis(fecha.getTimeInMillis() + (1 * dia));
		}
		for (int i=0;i<this.cantidadPartidos();i++){
			this.getPartidos().get(i).setFecha(new Date(fecha.getTimeInMillis()));
			if((i+1) % (cantidadEquipos()/2) == 0)
				fecha.setTimeInMillis(fecha.getTimeInMillis() + (7 * dia));
		}
	}
	
	public void arbitrosPartidos(){
		Arbitro mArbitro;
		boolean registrado = true;
		for (int i=0;i<this.cantidadPartidos();i++){
			registrado = false;
			while (!registrado){
				registrado = true;
				mArbitro = arbitroAleatorio();
				if (registradoArbitrosPartidos(mArbitro, i))
					registrado = false;
				else
					this.getPartidos().get(i).setArbitro(mArbitro);
			}
		}
	}
	
	public boolean registradoArbitrosPartidos(Arbitro mArbitro, int nro){
		int semana = (nro/(cantidadEquipos()/2));
		for (int i = semana * (cantidadEquipos()/2); i<nro;i++){
			if (getPartidos().get(i).getArbitro() == mArbitro)
				return true;
		}
		return false;
	}
	
	public void resultadosPartidos(){
		int golesLocal;
		int golesVisitante;
		int goleador;
		Jugador mJugador;
		for (int i=0;i<this.cantidadPartidos();i++){
			golesLocal = new Integer(numeroAleatorio(0,5));
			for(int l = 0; l < golesLocal; l++){
				goleador = new Integer(numeroAleatorio(0, partidos.get(i).getEquipoCasa().cantidadJugadores()-1));
				mJugador = partidos.get(i).getEquipoCasa().getJugadores().elementAt(goleador);
				partidos.get(i).getJugadoresGolesCasa().add(mJugador);
			}
			golesVisitante = new Integer(numeroAleatorio(0,5));
			for(int v = 0; v < golesVisitante; v++){
				goleador = new Integer(numeroAleatorio(0, partidos.get(i).getEquipoVisitante().cantidadJugadores()-1));
				mJugador = partidos.get(i).getEquipoVisitante().getJugadores().get(goleador);
				partidos.get(i).getJugadoresGolesVisitante().add(mJugador);
			}
		}
	}
	
	
	public void simulacionPartidos(){
		equiposPartidos();
		fechasPartidos();
		arbitrosPartidos();
		resultadosPartidos();
/*		imprimirPartidos();
		System.out.println("======================================");
		System.out.println("======================================");		
		imprimirEquipos();*/
	}
	
	public Vector<Equipo> tablaPosiciones(){
		Vector<Equipo> listaDesorden = new Vector<Equipo> (equipos);
		Vector<Equipo> listaOrdenada = new Vector<Equipo> ();
		int mayor;
		while(listaDesorden.size() != 0){
			mayor = listaDesorden.elementAt(0).ordenRecord();
			for (int i=1;i<listaDesorden.size();i++){
				if (mayor < listaDesorden.elementAt(i).ordenRecord())
					mayor = listaDesorden.elementAt(i).ordenRecord();
			}
			for (int j=0;j<listaDesorden.size();j++){
				if (mayor == listaDesorden.elementAt(j).ordenRecord()){
					listaOrdenada.add(listaDesorden.elementAt(j));
					listaDesorden.remove(j);
					j = listaDesorden.size();
				}
			}
		}
		return listaOrdenada;
	}

	public void imprimirPartidos(){
		for (int i=0;i<this.cantidadPartidos();i++){
			System.out.print(partidos.get(i).getCodigo());
			System.out.print(" - Arbitro: " + partidos.get(i).getArbitro().getNombre());
			System.out.print(" -- " + partidos.get(i).getFecha());
			System.out.print(" -- Casa: " + partidos.get(i).getEquipoCasa().getNombre());
			System.out.print(" -- GolesC: " + partidos.get(i).golesCasa());
			System.out.print(" - Visitante: " + partidos.get(i).getEquipoVisitante().getNombre());
			System.out.println(" - GolesV: " + partidos.get(i).golesVisitante());
		}
	}
	
	public void imprimirEquipos(){
		for (int i=0;i<this.cantidadEquipos();i++){
			System.out.print(equipos.get(i).getNombre());
			System.out.print(" - Ptos: " + equipos.get(i).puntos());			
			System.out.print(" - JJ: " + equipos.get(i).cantidadPartidos());
			System.out.print(" - JG: " + equipos.get(i).juegosGanados());
			System.out.print(" - JE: " + equipos.get(i).juegosEmpatados());
			System.out.print(" - JP: " + equipos.get(i).juegosPerdidos());
			System.out.print(" - GF: " + equipos.get(i).golesFavor());
			System.out.print(" - GC: " + equipos.get(i).golesContra());
			System.out.println(" - DG: " + equipos.get(i).diferenciaGoles());
		}
	}
}
